[HVM] Save/restore: don't leak shared-memory segments after HVM live-migrate.
authorTim Deegan <Tim.Deegan@xensource.com>
Thu, 26 Jul 2007 11:00:32 +0000 (12:00 +0100)
committerTim Deegan <Tim.Deegan@xensource.com>
Thu, 26 Jul 2007 11:00:32 +0000 (12:00 +0100)
Signed-off-by: Tim Deegan <Tim.Deegan@xensource.com>
tools/xcutils/xc_save.c

index 188ea7b72e86259919033bc8c23ef8431aef73eb..3a97683a970491a1295400f132396839368d999d 100644 (file)
@@ -54,8 +54,18 @@ static int suspend(int domid)
 
 static char *qemu_active_path;
 static char *qemu_next_active_path;
+static int qemu_shmid = -1;
 static struct xs_handle *xs;
 
+
+/* Mark the shared-memory segment for destruction */
+static void qemu_destroy_buffer(void)
+{
+    if (qemu_shmid != -1)
+        shmctl(qemu_shmid, IPC_RMID, NULL);
+    qemu_shmid = -1;
+}
+
 /* Get qemu to change buffers. */
 static void qemu_flip_buffer(int domid, int next_active)
 {
@@ -97,22 +107,23 @@ static void * init_qemu_maps(int domid, unsigned int bitmap_size)
 {
     key_t key;
     char key_ascii[17] = {0,};
-    int shmid = -1;
     void *seg; 
     char *path, *p;
 
     /* Make a shared-memory segment */
-    while (shmid == -1)
-    {
+    do {
         key = rand(); /* No security, just a sequence of numbers */
-        shmid = shmget(key, 2 * bitmap_size, 
+        qemu_shmid = shmget(key, 2 * bitmap_size, 
                        IPC_CREAT|IPC_EXCL|S_IRUSR|S_IWUSR);
-        if (shmid == -1 && errno != EEXIST)
+        if (qemu_shmid == -1 && errno != EEXIST)
             errx(1, "can't get shmem to talk to qemu-dm");
-    }
+    } while (qemu_shmid == -1);
+
+    /* Remember to tidy up after ourselves */
+    atexit(qemu_destroy_buffer);
 
     /* Map it into our address space */
-    seg = shmat(shmid, NULL, 0);
+    seg = shmat(qemu_shmid, NULL, 0);
     if (seg == (void *) -1) 
         errx(1, "can't map shmem to talk to qemu-dm");
     memset(seg, 0, 2 * bitmap_size);